/*
https://leetcode.cn/problems/fruit-into-baskets/submissions/562546850/
滑动窗口
水果成蓝
*/
class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        int i = 0, j = 0;
        int c1 = 0, c2 = 0; //类别起始索引，c1前类，c2后类
        int num = 0;
        for(; i < fruits.size(); ++i){
            if(fruits[i] != fruits[c1] and fruits[i] != fruits[c2]){
                if(c1 == c2){ 
                    c2 = i; //初始类别设置相同，寻找到新类别时索引赋给c2
                }
                else{
                    c2 = i; //新类别赋给c2
                    c1 = i - 1; //新类别前一个元素一定为另一个类别
                    num = i - j > num ? i - j : num; // 比较上一段窗口与历史最长，保存最长
                    j = i; // 从新类别前一个位置开始寻找左端点
                    while(fruits[j-1] == fruits[c2] or fruits[j-1] == fruits[c1]){
                        --j;
                    }
                    c1 = j; // 更新另一类别在滑动窗中的初始索引
                }
            }
        }
        return i - j > num ? i - j : num; // 若没有进入for中的if，则i-j（length-0）即最长，否则为循环中记录最长
    }
};